package com.hgx.su.common.pure.util.application;

import com.hgx.su.common.pure.dto.*;
import com.hgx.su.common.pure.exception.AppException;

import java.util.List;

import static com.hgx.su.common.pure.constants.GeneralConstant.COMMON_MODULE_CODE;
import static com.hgx.su.common.pure.constants.GeneralConstant.REMOTE_SERVICE_CALL_EXCEPTION_CODE;


/**
 * 真实数据对象获取工具
 */
public class ResultObjUtil {

    /**
     * 获取非包装真实数据对象
     *
     * @param resultResponse 结果对象
     * @param <T>            真实数据对象类型
     * @return 真实数据对象
     */
    public static <T> T getResObj(ResultResponse<T> resultResponse) {

        serverVerification(resultResponse);

        return resultResponse.getBody();
    }


    /**
     * 获取无返回值对象
     *
     * @param resultResponse 结果对象
     */
    public static void getNullClassResObj(ResultResponse<NullClassDto> resultResponse) {
        resultResponse.getBody();
    }

    /**
     * 获取OnePackageDto包装真实数据对象
     *
     * @param resultResponse 结果对象
     * @param <T>            真实数据对象类型
     * @return 真实数据对象
     */
    public static <T> T getOnePackageResObj(ResultResponse<OnePackageDto<T>> resultResponse) {
        OnePackageDto<T> body = resultResponse.getBody();
        return body.getData();
    }


    /**
     * 获取ListPackageDto包装真实数据对象
     *
     * @param resultResponse 结果对象
     * @param <T>            真实数据对象类型
     * @return list数据对象
     */
    public static <T> List<T> getListPackageResObj(ResultResponse<ListPackageDto<T>> resultResponse) {
        ListPackageDto<T> body = resultResponse.getBody();

        return body.getList();

    }

    /**
     * 服务接口结果调用校验
     *
     * @param resultResponse 结果对象
     * @param <T>            真实数据对象类型
     */
    public static <T> void serverVerification(ResultResponse<T> resultResponse) {
        PubResponse pubResponse = resultResponse.getPubResponse();
        if (pubResponse == null) {
            throw new AppException(COMMON_MODULE_CODE, REMOTE_SERVICE_CALL_EXCEPTION_CODE, "远程服务调用异常,返回值为空");
        }

        if (!"200".equals(pubResponse.getCode())) {
            throw new AppException(pubResponse.getModule(), pubResponse.getStatusCode(), pubResponse.getMsg());
        }
    }


//    public static void main(String[] args) {
//
//        List<GeneralCodeNameDto> list = new ArrayList<>();
//
//        ResultResponse<ListPackageDto<GeneralCodeNameDto>> ok = ResultResponse.ok(list);
//
//        List<GeneralCodeNameDto> listPackageResObj = ApplicationObjUtil.getListPackageResObj(ok);
//
//
//        ResultResponse<OnePackageDto<Long>> ok2 = new ResultResponse<>() ;
//
//        Long onePackageResObj = ApplicationObjUtil.getOnePackageResObj(ok2);
//
//
//        ResultResponse<NullClassDto> nullClassDtoResultResponse = new ResultResponse<>() ;
//
//        ApplicationObjUtil.getNullClassResObj(nullClassDtoResultResponse);
//
//        ResultResponse<GeneralCodeNameDto> resultResponse = new ResultResponse<>() ;
//        GeneralCodeNameDto resObj = ApplicationObjUtil.getResObj(resultResponse);
//
//
//
//    }


}
